package cn.itcast.com.homework.day88.test1;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
1. 自定义注解，该注解用来描述，方法运行所需的时间上限(用long类型的数据表
示时间，单位为ms)，然后，自定义注解处理器，运行加了运行时间上限注解的方法，
判断方法的运行时间，是否超出了注解中规定的时间上限，如果超过，则返回true，
未超过返回false
 */
public class test {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        //.class获得TestTime的对象
        Class tt = TestTime.class;
        Object o = tt.newInstance();
        boolean b = time200(tt, o);
        System.out.println(b);

    }

    private static boolean time200(Class tt, Object o) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        //获得method对象
        Method run = tt.getDeclaredMethod("run");
        long value = 0;
        //判断run方法上面是否有注解
        if (run.isAnnotationPresent(RunTime.class)){
            //如果有注解，获得注解的属性值
            value = run.getAnnotation(RunTime.class).value();
        }
        //通过System.currentTimeMillis()方法计算运行时间
        long starTime = System.currentTimeMillis();
        run.invoke(o,null);
        long endTime = System.currentTimeMillis();

        if (endTime - starTime <= value){
            return true;
        }else {
            return false;
        }
    }
}


class TestTime{
    //注解添加信息 value 200
    @RunTime(200)
    //定义一个方法用来准确的判断时间，
    public void run() throws InterruptedException {
        Thread.sleep(300);
    }
}